import numpy as np
from Tools import metrics_result
from Tools import readbunchobj
from sklearn.naive_bayes import MultinomialNB
from joblib import dump
from sklearn.preprocessing import StandardScaler

# 导入训练集
trainpath = "../train_word_bag/tf_idf_space.dat"
train_set = readbunchobj(trainpath)

# 导入测试集
testpath = "../test_word_bag/test_tf_idf_space.dat"
test_set = readbunchobj(testpath)

# 输出单词矩阵的类型
print("标准化/归一化前的矩阵形状:")
print(np.shape(train_set.tdm))
print(np.shape(test_set.tdm))

# # 标准化数据：将词频矩阵中的每个特征（即每个单词的频率）缩放到具有零均值和单位方差的状态。这样做可以改善很多机器学习算法的性能，特别是那些假设数据特征具有相同尺度的算法。
# # 保持稀疏性：通过设置 with_mean=False，代码确保在标准化过程中不会破坏稀疏矩阵的结构，这对于处理文本数据很重要，因为文本数据通常表现为稀疏矩阵。
# # 对数据进行标准化或归一化
# scaler = StandardScaler(with_mean=False)
# train_set.tdm = scaler.fit_transform(train_set.tdm)
# test_set.tdm = scaler.transform(test_set.tdm)

# 朴素贝叶斯
print("开始训练朴素贝叶斯模型...")
# 在具有大量特征（例如，单词）的文本分类任务中，应用了一个非常小的平滑值，防止模型过度拟合训练数据
Bayes_clf = MultinomialNB(alpha=0.001).fit(train_set.tdm, train_set.label)
print("朴素贝叶斯模型训练完成。")
dump(Bayes_clf, 'Bayes_model.joblib')

# 预测分类结果
print("USE: 贝叶斯模型 预测分类结果")
Bayes_predicted = Bayes_clf.predict(test_set.tdm)
Bayes_total = len(Bayes_predicted)
print("结束")

# 性能评估
print("\n贝叶斯模型：")
metrics_result(test_set.label, Bayes_predicted, Bayes_total)

